#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 函数：将十六进制字符转换为对应的四位二进制数值
char *hexCharToBinary(char hexChar) {
    switch(hexChar) {
        case '0': return "0000";
        case '1': return "0001";
        case '2': return "0010";
        case '3': return "0011";
        case '4': return "0100";
        case '5': return "0101";
        case '6': return "0110";
        case '7': return "0111";
        case '8': return "1000";
        case '9': return "1001";
        case 'A': case 'a': return "1010";
        case 'B': case 'b': return "1011";
        case 'C': case 'c': return "1100";
        case 'D': case 'd': return "1101";
        case 'E': case 'e': return "1110";
        case 'F': case 'f': return "1111";
        default: return NULL; // 非法输入
    }
}

// 函数：将十六进制字符串转换为对应的二进制字符串
char *hexToBinary(char *hex) {
    int length = strlen(hex);
    char *binary = malloc(length * 4 + 1); // 每个十六进制字符对应四位二进制字符，再加一个结束符'\0'
    if (binary == NULL) {
        printf("Memory allocation failed.\n");
        exit(1);
    }

    // 逐个处理每个十六进制字符，将其转换为对应的二进制字符串
    for (int i = 0; i < length; i++) {
        char *binaryChar = hexCharToBinary(hex[i]);
        if (binaryChar == NULL) {
            printf("Invalid hexadecimal character: %c\n", hex[i]);
            free(binary);
            exit(1);
        }
        strcat(binary, binaryChar); // 将每个二进制字符追加到二进制字符串末尾
    }
    return binary;
}

// 函数：将二进制字符串转换为对应的八进制数值
int binaryToOctal(char *binary) {
    int length = strlen(binary);
    int octal = 0, octalDigit = 0, base = 1;

    // 从二进制字符串的末尾开始，每三位二进制数对应一个八进制数位
    for (int i = length - 1; i >= 0; i--) {
        if (binary[i] == '1') {
            octalDigit += base; // 如果当前位为 1，则累加到当前八进制数位上
        }
        base *= 2; // 二进制数位每次左移一位，相当于乘以 2
        if ((length - i) % 3 == 0 || i == 0) {
            // 每累加三位二进制数，或者已经处理到二进制字符串的首位时，将当前八进制数位加到结果中
            octal = octalDigit * base + octal;
            base = 1;
            octalDigit = 0;
        }
    }
    return octal;
}

int main() {
    char hex[100];
    char *binary;
    int octal;

    printf("Enter a hexadecimal number: ");
    scanf("%s", hex);

    // 将十六进制数转换为二进制数
    binary = hexToBinary(hex);

    // 输出二进制数
    printf("Equivalent binary number: %s\n", binary);

    // 将二进制数转换为八进制数
    octal = binaryToOctal(binary);

    // 输出八进制数
    printf("Equivalent octal number: %d\n", octal);

    // 释放动态分配的内存
    free(binary);

    return 0;
}